//有100个接口请求地址，要求实现一个工具方法，并发数最多5个来请求这100个接口，要求尽量使用async await。
// 正常不做控制，会有大量的请求在队列中等待，会阻塞，可能会导致超时、出现崩溃等
// for循环，逐条发送
// for循环，分组发送，一次发送五个
// 这个五来的原因是chrome默认限制同时最多开启六个TCP链接，所以将其分为5条一组,留一条处理别的请求
// 数组模拟队列的思想，先进先出，先入队列的请求先发，push和shift

const size:5 = 5;
let running:number = 0 // 当前请求数
const taskList:(()=>Promise<unknown>)[] = [];//正在执行的任务队列

// 执行任务
const run  = async () => {
    if(running >= size) return; // 处理边界，如果当前执行数大于总数，终止
    const taskHandle = taskList.shift(); // 取出第一个先入队的请求
    if(!taskHandle) return; // 没有任务直接return；
    running++; // 有任务，正在执行的任务加1；
    const result = await taskHandle();
    // 结束后正在执行的任务减一，递归执行
    if(result){
        running--;
        run()
    }
    // 没有正在执行的任务了,执行之后的逻辑
    if(running === 0){
        // 比如刷新列表
        // tableHooks.reload()
    }
}

// 添加任务
function addTask(task: () => Promise<any>){
    taskList.push(task);
    run();
}

// 遍历添加任务
for (const runElement of new Array(100)){
    addTask(runElement)
}